/**
 * \file: produit.c
 * \author: Kacouchia and Diop
 *IMplementation de produit.c
 */
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>

#include "produit.h" 
#include "categorie.h" 
#include "typesprimitifs.h" 

#define LOWEST_ID 999
/**
 * Pour gérer le code des produits.
 * Mis en statique, pour eviter son acces depuis l'exterieur de ce fichier.
 */
static ENTIER_POSITIF ID = LOWEST_ID;

POINTEUR_PRODUIT creer_produit(CHAINE nom, ENTIER_POSITIF quantite_dispo,
        DOUBLE prix_un, CATEGORIE categorie) {

    POINTEUR_PRODUIT pp = malloc(sizeof (*pp));
    pp->ID = ID++;
    strcpy(pp->nom, nom);
    pp->quantite_disponible = quantite_dispo;
    pp->prix_u = prix_un;
    pp->categorie = categorie;
    return pp;
}

extern POINTEUR_PRODUIT chercher_produit(POINTEUR_LISTE_PRODUIT lp,
        ENTIER_POSITIF id) {
    POINTEUR_PRODUIT resultat;
    POINTEUR_LISTE_PRODUIT curseur = lp;
    if (id < LOWEST_ID)
        return NULL;
    while (curseur != NULL) {
        if (curseur->pproduit != NULL && curseur->pproduit->ID == id) {
            resultat = curseur->pproduit;
            break;
        }
        curseur = curseur->suivant;
    }
    return resultat;
}

void afficher_produit(POINTEUR_PRODUIT p) {
    STRING categorie = donner_nom_categorie(p->categorie);
    printf("Identifiant : %d\n", p->ID);
    printf("Nom         : %s\n", p->nom);
    printf("Categorie   : %s\n", categorie);
    printf("Prix        : %f\n", p->prix_u);
}

BOOLEEN augmenter_quantite_disponible(ENTIER_POSITIF quantite,
        POINTEUR_PRODUIT pp) {
    BOOLEEN resultat = faux;

    if (pp != NULL) {
        pp->quantite_disponible += quantite;
        resultat = vrai;
    }
    /*
    printf("Pour quelle produit voulez-vous augmenter la quantite?");
    scanf("%s", &pp->nom[0]);
    printf("De combien voulez-vous augmentez la quantite disponible?");
    scanf("%d", &quantite);
    s = pp->quantite_disponible + quantite;
    if (s < quantite_dispo) {
        resultat = faux;
    } else {
        resultat = vrai;
    }
     */
    return resultat;
}

BOOLEEN reduire_quantite_disponible(ENTIER_POSITIF quantite,
        POINTEUR_PRODUIT pp) {

    BOOLEEN resultat = faux;

    if (pp != NULL) {
        if (pp->quantite_disponible - quantite < 0) {
            pp->quantite_disponible = 0;
        } 
        else 
        {
            pp->quantite_disponible -= quantite;
        }
        resultat = vrai;
    }

    /*
    printf("Pour quelle produit voulez-vous reduire la quantite?");
    scanf("%s", &pp->nom);
    printf("De combien voulez-vous reduire la quantite disponible?");
    scanf("%d", &quantite);
    s = pp->quantite_disponible - quantite;
    if (s > pp->quantite_disponible) {
        resultat = faux;
    } else {
        resultat = vrai;
    }
     */
    return resultat;
}

BOOLEEN changer_prix_unitaire(DOUBLE prix_un, POINTEUR_PRODUIT pp) {
    BOOLEEN resultat = faux;
    if (pp != NULL) {
        if (prix_un != pp->prix_u && prix_un > 0) {
            pp->prix_u = prix_un;
            resultat = vrai;
        }
    }
    return resultat;
}

void liberer_produit(POINTEUR_PRODUIT pp) {
    free(pp);
}
